aardio 文档

aardio 范例: 调用 VBA/JSA 操作 Excel

//aardio 调用 VBA/JSA 操作 Excel 
import console.int; 
import com.excel; 

var xl;

try{
    //打开或创建 Excel 文件,xlsm 格式支持宏( VBA / JSA )。
    xl = com.excel("/vba.xlsm");
}
catch(e){
    console.error(e)
    if(::Kernel32.GetACP()===65001){
        console.log("注意 VBA 不支持 UTF-8 。
如果系统系统了 UTF-8 内码(区域设置 » Beta 版:使用 Unicode UTF-8 提供全球多语言支持)。
则打开 xlsm 的代码会报错“Open 方法不可用”,Excel 自己也无法打开 VBA(会提示损坏,修复就会删除 VBA 代码) 。")
    }
}

//自由调用 VBA / JSA 函数,不需要确认启用宏。
var data = xl.vba.GetSheetData();//先用 VBA 编写函数,宏管理器能看到函数名。

/*
自动支持 VBA 数组,不需要任何其他封装。
数组是值类型,操作数组不用再返回 VBA 进程,相对来说简单高效。
*/
console.dumpJson(data);

/*
VBA 也可以自由调用 aardio 对象。
所有 aardio 对象都支持 VBA 迭代For Each … Next 语句。

在 VBA 可以调用 aardio 对象的属性、函数。
但 VBA  动态读写属性要这样写:
CallByName (aardioObject, "读取属性名", vbGet)
CallByName aardioObject, "写入属性名", VbSet, "属性值"
*/
xl.vba.CallAnything({
    //在 Excel 或 WPS 表格中按 ALT + F11 打开代码窗口。
    //VBA 编辑器会自动将某些函数名转为大写,aardio 是区分大小写的。
    Log = function(str){

        console.log("VBA调用任意 aardio 函数,参数:",str);

        //owner 表示当前拥有 Log 函数的对象自身
        console.log(owner.Name)
    };

    Name = "aardio";
});

/***
VBA,JSA 源码可打开 /vba.xlsm 查看代码。

JSA 调用 aardio 对象的成员函数要这样写:
aardioObject.Invoke("Log","这是来自 JSA 的参数。"); 
而 VBA 可以直接写 aardioObject.Log("这是来自 JSA 的参数。")

JSA 里读写 aardio 对象属性
aardioObject.Invoke_Get("属性名"); 
aardioObject.Invoke_Set("属性名","属性值"); 

另外 aardio 里可以用 
JSON.stringify( value ) 将对象转换为 JSON。
也可以用 JSON.parse( json ) 方便地解析 JSON 为对象。

而 JS 使用 JSON.stringify( value ) 生成 JSON。
使用 JSON.parse 解析 JSON。

使用 JSON 交互数据也是很方便的。

在 aardio 里调用 JSA 代码中可以可以插入 debugger; 语句。
WPS 遇到 debugger; 会自动跳出调试工具。
***/

/***
VBA 源码

Function GetSheetData() As Variant
    Dim dataArr As Variant
    Dim lastRow As Long
    Dim lastCol As Long
    Dim rng As Range
    Dim i As Long, j As Long

    ' 寻找最后一个被使用的行和列
    lastRow = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    lastCol = Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column

    ' 设置范围
    Set rng = Range(Cells(1, 1), Cells(lastRow, lastCol))

    ' 将数据值存入数组
    dataArr = rng.Value

    ' 返回数组
    GetSheetData = dataArr
End Function


' VBA 可以直接调用 aardio 的任意对象任意函数。
Public Sub CallAnything(ByVal aardioObject As Object)

    ' 修改对象的属性
    aardioObject.Name = "Office"

    ' 调用对象的函数
    aardioObject.Log ("这是来自 VBA 的参数。")

    '如果对象就是函数,也可以如下直接调用
    'aardioObject ("其他调用参数。")

End Sub

***/

/***
JSA 源码

function GetSheetData() {
    var dataArr = [];
    var lastRow, lastCol;
    var rng;
    var i, j;

    // 寻找最后一个被使用的行和列
    lastRow = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row;
    lastCol = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column;

    // 设置范围
    rng = ActiveSheet.Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(lastRow, lastCol));

    // 将数据值存入数组
    dataArr = rng.Value();

    return dataArr;
}

function CallAnything(aardioObject) { 
    //debugger; //运行时打开调试,非常方便

    //读取 aardio 对象的值,参数 @1 为要读取的字段名
    var name = aardioObject.Invoke_Get("Name");

    //修改 aardio 对象的值,参数 @1 为要修改的字段名
    aardioObject.Invoke_Set("Name","WPS");

    //调用 aardio 函数,参数 @1 为函数名,后面为其他调用参数。
    aardioObject.Invoke("Log","这是来自 JSA 的参数。"); 

    //如果 aardioObject 是函数对象,则可以直接调用
    //aardioObject("其他调用参数");
}

***/
Markdown 格式